import 'Types.dart';

/////////////////////////////////////////////////////////////////////////
// 符号表
//



/// 符号类型
enum SymKind{Variable, Function,  Parameter, Prog}

/// 符号
abstract class Symbol{
   String name;
   SymKind kind;

   Symbol(this.name,this.kind);
   /// visitor模式
   /// @param vistor
   /// @param additional 额外需要传递给visitor的信息。
   Object accept(SymbolVisitor vistor,Object additional);
}

class VarSymbol extends Symbol{
  VarSymbol(String name):super(name, SymKind.Variable);

  @override
  Object accept(SymbolVisitor vistor, Object additional) {
    return vistor.visitVarSymbol(this, additional);
  }

}
class FunctionSymbol extends Symbol{
  List<VarSymbol> vars;//本地变量的列表。参数也算本地变量。
  FunctionSymbol(String name, this.vars)
      :super(name, SymKind.Function);

  @override
  Object accept(SymbolVisitor vistor, Object additional) {
    return vistor.visitFunctionSymbol(this, additional);
  }

}

///////////////////////////////////////////////////////////////////////
//visitor
abstract class SymbolVisitor{
  Object visitVarSymbol(VarSymbol sym, Object additional);
  Object visitFunctionSymbol(FunctionSymbol sym,  Object additional);
}

/////////////////////////////////////////////////////////////////////////
//一些系统内置的符号
Map<String, FunctionSymbol> built_ins = {};